#
# Created by Administrator on 2021/8/2 AT 9:48.
#


# 请你判断一个9x9 的数独是否有效。只需要 根据以下规则 ，验证已经填入的数字是否有效即可。
#
# 数字1-9在每一行只能出现一次。
# 数字1-9在每一列只能出现一次。
# 数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。（请参考示例图）
# 数独部分空格内已填入了数字，空白格用'.'表示。
#
# 来源：力扣（LeetCode）
# 链接：https://leetcode-cn.com/problems/valid-sudoku
# 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

from typing import List


class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        rowNum = [[0] * 9 for _ in range(9)]
        colNum = [[0] * 9 for _ in range(9)]
        squareNum = [[[0] * 9 for _ in range(3)] for __ in range(3)]  # 3*3*9
        for i in range(9):
            for j in range(9):
                if board[i][j] == '.':
                    continue
                else:
                    digit = int(board[i][j]) - 1
                    rowNum[i][digit] += 1  # 对行的贡献
                    colNum[j][digit] += 1  # 对列的贡献
                    squareNum[i // 3][j // 3][digit] += 1  # 对3*3小块的贡献
                    if rowNum[i][digit] > 1 or colNum[j][digit] > 1 or squareNum[i // 3][j // 3][digit] > 1:
                        return False
        return True


if __name__ == '__main__':
    sol = Solution()
    print(sol.isValidSudoku(board=[["5", "3", ".", ".", "7", ".", ".", ".", "."],
                                   ["6", ".", ".", "1", "9", "5", ".", ".", "."],
                                   [".", "9", "8", ".", ".", ".", ".", "6", "."],
                                   ["8", ".", ".", ".", "6", ".", ".", ".", "3"],
                                   ["4", ".", ".", "8", ".", "3", ".", ".", "1"],
                                   ["7", ".", ".", ".", "2", ".", ".", ".", "6"],
                                   [".", "6", ".", ".", ".", ".", "2", "8", "."],
                                   [".", ".", ".", "4", "1", "9", ".", ".", "5"],
                                   [".", ".", ".", ".", "8", ".", ".", "7", "9"]]))
